Clone a Document
1 Purpose
This example provides template and script to 'clone' a document. This can be useful for creating documents from templates with large numbers of fields where only one or two may change.
2 Template Example
Template:
"components": [
{
"componentName": "sc-static-html",
"fullWidth": true,
"html": "<style>.formbirdIcon{float:right} .panel-A {background:#fffff;border:1px black;box-shadow: 10px 10px 5px grey;} .panel-A > .panel-heading {background:#6a99f4;color:white;font-size:1.25em;font-weight:200;padding:1px 1px 1px 10px} </style>",
"name": "panelStyle"
},
{
"componentName": "sc-static-html",
"fullWidth": true,
"label": "Clone An Asset",
"name": "panel1",
"wrapAction": "open",
"wrapHtmlType": "wrap",
"wrapClass": "panel-A"
},
{
"componentName": "sc-related-document",
"label": "Asset To Clone",
"name": "cloneAssetRel",
"filter": "{'query':{'bool':{'filter':[{'term':{'systemHeader.systemType': 'document'}},{'term':{'appTags':'asset'}}]}}}",
"showDropDown": true,
"singleSelection": true,
"fullWidth": true,
"disableSave": true
},
{
"componentName": "sc-button",
"caption": "Clone",
"name": "cloneButton",
"style": "btn-primary"
},
{
"componentName": "sc-static-html",
"label": "",
"name": "panel1",
"wrapHtmlType": "wrap",
"wrapAction": "close"
}
],
3 Script
{
#include "JayRule Ruleset Overlay JS",
ruleset : {
name : 'Clone Asset',
ruleClone : {
ruleCondition : function(ntf) {
var fieldChanged = ntf.context.fieldChanged;
// related field from template ---> cloneAssetRel
return (fieldChanged === 'cloneButton'
&& ntf.document.cloneAssetRel
&& ntf.document.cloneAssetRel.length);
},
ruleAction : function(ntf,callback) {
var ft3=ntf.scope;
var eqry = { 'query': { 'bool': { 'filter': [{ 'term': { 'documentId': ntf.document.cloneAssetRel[0].documentId }}] } } };
ntf.logger.info('eqry ' + JSON.stringify(eqry));
ft3.findDocumentsByElastic(eqry, ntf.context.user.documentId, function(err, result) {
if(err){
ntf.logger.info('Error: ' + err.message);
} else {
ntf.doc = result.data.hits.hits[0]._source;
}
callback();
});
}
},
ruleCreateNew : {
ruleCondition : function(ntf) {
return (ntf.doc);
},
ruleAction : function(ntf,callback) {
var ft3=ntf.scope;
var tplId = ntf.doc.systemHeader.templateId;
// example ..... remove fields
delete ntf.doc.assetId;
// example ..... update fields
var newDateCreated = new Date();
ntf.doc.dateCreated = newDateCreated;
// must delete documentId and systemHeader from existing document
delete ntf.doc.documentId;
delete ntf.doc.systemHeader;
ntf.logger.info('template '+tplId);
ntf.logger.info('doc '+JSON.stringify(ntf.doc));
ft3.createDocumentFromTemplate(ntf.doc,tplId,ntf.user.documentId,function(err,doc){
if (err) {
ntf.logger.error('Error creating document: ' + err);
}
else {
ntf.logger.info('Document created: ' + doc.documentId);
var link = '<a href="/#/form/' + doc.documentId + '" target="_blank">'
+ doc.systemHeader.summaryName + '</a><br/>';
ft3.ModalService.openModal({
title : 'Asset Created',
html : link,
type : 'info'
});
}
callback();
});
delete ntf.document.cloneAssetRel;
}
}
}
}